package de.mnit.basis.daten;

import de.mnit.basis.daten.struktur.liste.Liste;
import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.daten.struktur.tabelle.typ.TypTabelle2;
import de.mnit.basis.daten.typ.zeit.Datum;
import de.mnit.basis.daten.typ.zeit.S_Datum;
import de.mnit.basis.daten.typ.zeit.S_Zeitpunkt;
import de.mnit.basis.daten.typ.zeit.Zeitpunkt;
import de.mnit.basis.fehler.Fehler;


/**
 * @author Michael Nitsche
 * 24.11.2010	Erstellt
 */
public class WandleText {

	// Siehe CSV_Tabelle: TODO Abgleichen!!!
	public static String[] vonCsvZeile(String text, char trenner_feld, char trenner_spalte) {
		S_Liste<String> erg=Liste.neu();
		boolean offen=false;
		boolean doppel_tf=false;
		String feld="";
		for(int p=0; p<text.length(); p++) {
			char c=text.charAt(p);
			boolean letztes= p==text.length()-1;
//				Ausgabe.debug(feld, offen, p, c);
			if(c==trenner_feld) {
				if(doppel_tf) {
					doppel_tf=false;
					feld+=c;
					continue;
				}
				if(offen) {
					if(letztes || text.charAt(p+1)!=trenner_feld)
						offen=false;
					else
						doppel_tf=true;
				}
				else
					offen=true;
				continue;
			}
			if(!offen && c==trenner_spalte) {
				erg.plus(feld);
				feld="";
				if(letztes)
					erg.plus("");
				continue;
			}
			feld+=c;
		}
		if(feld.length()>0)
			erg.plus(feld);
		return erg.zuBereich(String.class);
	}

	public static Integer zuInteger(String text) {
		if(text==null)
			return null;
		try {
			return Integer.parseInt(text);
		}
		catch(NumberFormatException e) {
			return null;
		}
	}

	public static Boolean zuBoolean(String text) {
		if(text==null)
			return null;
		try {
			return Boolean.parseBoolean(text);
		}
		catch(Exception e) {
			return null;
		}
	}

	/**
	 * Spalte 2 enthält den Bool-Wert, ob es sich bei dem Wert in Spalte 1 um einen Trenner handelt.
	 */
	public static TypTabelle2<String,Boolean> inTeile(String text, String... trenner) {
		TypTabelle2<String,Boolean> erg=TypTabelle2.neu(String.class,Boolean.class);
		TypTabelle2<Integer,String> tab=SucheText.positionenMulti(text, trenner);
		for(int tz=1; tz<=tab.gLaenge(); tz++) {
			int von=tab.gSpalte1().gib(tz);
			String trenn=tab.gSpalte2().gib(tz);

			if(tz==1 && von>1)
				erg.plus(FilterText.teil(1, von-1, text), false);

			int bis=tz<tab.gLaenge() ? tab.gSpalte1().gib(tz+1)-1 : text.length();
			int vonText=von+trenn.length();
			erg.plus(trenn, true);
			if(vonText<=bis)
				erg.plus(FilterText.teil(vonText, bis-vonText+1, text), false);
		}
		if(tab.gLaenge()==0 && text.length()>0)
			erg.plus(text, false);
		return erg;
	}

	@SuppressWarnings("unchecked")
	public static <T> T zuObject(String s, Class<T> c) {
		if(s==null)
			return null;
		Fehler.objekt.wenn_Null(c);
		if(c == String.class)
			return (T)s;
		if(c == Integer.class)
			return (T)(Integer)Integer.parseInt(s);
		if(c == S_Datum.class)
			return (T)Datum.neu(s);
		if(c == Boolean.class)
			return (T)(Boolean)Boolean.parseBoolean(s);
		if(c == S_Zeitpunkt.class)
			return (T)Zeitpunkt.neu(s);

		throw Fehler.sonstige.da_ToDo("Unbekannte Klasse zum umwandeln", s, c);
	}

	/**
	 * 	Alternativ: text.split(trenner);
	 *	Diese Funktion hier arbeitet aber irgendwie genauer!
	 */
	public static S_Liste<String> zuListe(String trenner, String text) {
		Fehler.text.wenn_Null_o_Leer(trenner);
		Fehler.objekt.wenn_Null(text);
		S_Liste<String> erg=Liste.neu();
		if(text.length()==0)
			return erg;

		int start=1;
		if(text.indexOf(trenner)==0)
			erg.plus(""); //Falls Trenner am Anfang
		else
			start-=trenner.length();
//		else text=trenner+text;

		while(start<=text.length()) {
			start+=trenner.length();
			int nt=text.indexOf(trenner, start-1)+1;
			if(nt<1)
				nt=text.length()+1;
			if(start>text.length())
				erg.plus("");
			else
				erg.plus(FilterText.teil(start, nt-start, text));
			start+=nt-start;
		}

		return erg;
	}

	public static String[] zuStringArray(String trenner, String text) {
		return zuListe(trenner,text).zuBereich(String.class);
	}

}
